package com.cjj.common.framework.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;

import javax.validation.constraints.NotNull;

/**
 * <p>
 * Security 全局异常
 * </p>
 *
 */
@Getter
public class SecurityException extends RuntimeException{

    private final Integer code;

    private final String message;

    private final Status status;

    public SecurityException(@NotNull Status status) {
        super(status.getMessage());
        this.code = status.getCode();
        this.message = status.getMessage();
        this.status=status;
    }

    @AllArgsConstructor
    @Getter
    public enum Status {
        /**
         * 请先登录！
         */
        UNAUTHORIZED(401, "请先登录！"),

        /**
         * 暂无权限访问！
         */
        ACCESS_DENIED(403, "权限不足！"),

        /**
         * 请求不存在！
         */
        REQUEST_NOT_FOUND(404, "请求不存在！"),

        /**
         * 请求方式不支持！
         */
        HTTP_BAD_METHOD(405, "请求方式不支持！"),

        /**
         * 请求异常！
         */
        BAD_REQUEST(400, "请求异常！"),

        /**
         * 参数不匹配！
         */
        PARAM_NOT_MATCH(400, "参数不匹配！"),

        /**
         * 参数不能为空！
         */
        PARAM_NOT_NULL(400, "参数不能为空！"),

        /**
         * 当前用户已被锁定，请联系管理员解锁！
         */
        USER_DISABLED(403, "当前用户已被锁定，请联系管理员解锁！"),

        /**
         * 用户错误
         */
        USERNAME_PASSWORD_ERROR(5001, "用户名或密码错误！"),
        LOGIN_EXPIRED(5002, "请重新登录"),
        /**
         * token 已过期，请重新登录！
         */
        TOKEN_EXPIRED(5002, "token 已过期，请重新登录！"),

        /**
         * token 解析失败，请尝试重新登录！
         */
        TOKEN_PARSE_ERROR(5002, "token 解析失败，请尝试重新登录！"),
        TOKEN_OUT_OF_CTRL(5003, "当前用户已在别处登录，请尝试更改密码或重新登录！"),
        CODE_ERROR(5004,"验证码错误"),
        ACCOUNT_EXIST(5005,"账号已存在"),
        PHONE_NOT_EXIST(5006,"手机号不存在"),
        PASSWORD_EDIT_REPEAT(5007,"新密码与旧密码相同"),
        OLD_PASSWORD_ERROR(5008,"原密码错误"),

        /**
         * 业务错误
         */
        OUT_OF_LEVEL(6001,"客户使用机构层级大于6级，请重新选择上级机构"),
        OUT_OF_LIMIT_NUM(6002,"创建数量已达上限"),
        SUB_DOMAIN_ALREADY_EXIST(6003,"二级域名已存在"),
        ORGANIZATION_NAME_ALREADY_EXIST(6004,"机构名称已存在"),
        OPERATION_COMPLETE_BY_ANYONE(6005,"操作已完成，请勿重复操作"),
        /**
         * 数据库
         */
        DATA_NOT_FOUND(8001,"数据未找到"),

        DEFAULT_ERROR(9001,"未知错误"),
        PARAMETER_ERROR(9002, "参数不合法"),
        ;
        private Integer code;
        private String message;

    }

}
